const Mainloop = imports.mainloop;
const Signals = imports.signals;
+const DND = imports.ui.dnd;
const Main = imports.ui.main;
const GenericDisplay = imports.ui.genericDisplay;
const PLACES_VSPACING = 8;
const PLACES_ICON_SIZE = 16;
-function PlaceDisplay(name, icon, onActivate) {
- this._init(name, icon, onActivate);
+/**
+ * An entry in the places menu.
+ * @name: String title
+ * @iconFactory: A JavaScript callback which will create an icon texture
+ * @onActivate: A JavaScript callback to launch the entry
+ */
+function PlaceDisplay(name, iconFactory, onActivate) {
+ this._init(name, iconFactory, onActivate);
}
PlaceDisplay.prototype = {
- _init : function(name, iconTexture, onActivate) {
+ _init : function(name, iconFactory, onActivate) {
this.actor = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
reactive: true,
spacing: 4 });
- this.actor.connect('button-press-event', Lang.bind(this, function (b, e) {
+ this.actor.connect('button-release-event', Lang.bind(this, function (b, e) {
onActivate(this);
+ Main.overview.hide();
}));
let text = new Clutter.Text({ font_name: "Sans 14px",
ellipsize: Pango.EllipsizeMode.END,
color: GenericDisplay.ITEM_DISPLAY_NAME_COLOR,
text: name });
let iconBox = new Big.Box({ y_align: Big.BoxAlignment.CENTER });
- iconBox.append(iconTexture, Big.BoxPackFlags.NONE);
+ this._icon = iconFactory();
+ iconBox.append(this._icon, Big.BoxPackFlags.NONE);
this.actor.append(iconBox, Big.BoxPackFlags.NONE);
this.actor.append(text, Big.BoxPackFlags.EXPAND);
+
+ this._iconFactory = iconFactory;
+ this._onActivate = onActivate;
+
+ this.actor._delegate = this;
+ let draggable = DND.makeDraggable(this.actor);
+ },
+
+ getDragActorSource: function() {
+ return this._icon;
+ },
+
+ getDragActor: function(stageX, stageY) {
+ return this._iconFactory();
+ },
+
+ //// Drag and drop methods ////
+
+ shellWorkspaceLaunch : function() {
+ this._onActivate();
}
};
Signals.addSignalMethods(PlaceDisplay.prototype);
let homeUri = homeFile.get_uri();
let homeLabel = Shell.util_get_label_for_uri (homeUri);
let homeIcon = Shell.util_get_icon_for_uri (homeUri);
- let homeTexture = Shell.TextureCache.get_default().load_gicon(homeIcon, PLACES_ICON_SIZE);
- let home = new PlaceDisplay(homeLabel, homeTexture, Lang.bind(this, function() {
- Main.overview.hide();
- Gio.app_info_launch_default_for_uri(homeUri, Main.createAppLaunchContext());
- }));
+ let home = new PlaceDisplay(homeLabel,
+ function() {
+ return Shell.TextureCache.get_default().load_gicon(homeIcon, PLACES_ICON_SIZE);
+ },
+ function() {
+ Gio.app_info_launch_default_for_uri(homeUri, Main.createAppLaunchContext());
+ });
this._menuBox.append(home.actor, Big.BoxPackFlags.NONE);
}
if (networkApp != null) {
- let networkIcon = networkApp.create_icon_texture(PLACES_ICON_SIZE);
- let network = new PlaceDisplay(networkApp.get_name(), networkIcon, Lang.bind(this, function () {
- Main.overview.hide();
- networkApp.launch();
- }));
+ let network = new PlaceDisplay(networkApp.get_name(),
+ function() {
+ return networkApp.create_icon_texture(PLACES_ICON_SIZE);
+ },
+ function () {
+ networkApp.launch();
+ });
this._menuBox.append(network.actor, Big.BoxPackFlags.NONE);
}
- let connectIcon = Shell.TextureCache.get_default().load_icon_name("applications-internet", PLACES_ICON_SIZE);
- let connect = new PlaceDisplay('Connect to...', connectIcon, Lang.bind(this, function () {
- Main.overview.hide();
- new Shell.Process({ args: ['nautilus-connect-server'] }).run();
- }));
+ let connect = new PlaceDisplay('Connect to...',
+ function () {
+ return Shell.TextureCache.get_default().load_icon_name("applications-internet", PLACES_ICON_SIZE);
+ },
+ function () {
+ new Shell.Process({ args: ['nautilus-connect-server'] }).run();
+ });
this._menuBox.append(connect.actor, Big.BoxPackFlags.NONE);
this._bookmarksPath = GLib.build_filenamev([GLib.get_home_dir(), ".gtk-bookmarks"]);
if (label == null)
continue;
let icon = Shell.util_get_icon_for_uri(bookmark);
- let iconTexture = Shell.TextureCache.get_default().load_gicon(icon, PLACES_ICON_SIZE);
- let item = new PlaceDisplay(label, iconTexture, Lang.bind(this, function() {
- Main.overview.hide();
- Gio.app_info_launch_default_for_uri(bookmark, Main.createAppLaunchContext());
- }));
+
+ let item = new PlaceDisplay(label,
+ function() {
+ return Shell.TextureCache.get_default().load_gicon(icon, PLACES_ICON_SIZE);
+ },
+ function() {
+ Gio.app_info_launch_default_for_uri(bookmark, Main.createAppLaunchContext());
+ });
this._dirsBox.append(item.actor, Big.BoxPackFlags.NONE);
}
}